package concursos.controladores;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;

import concursos.interfaces.ArquivoService;
import concursos.interfaces.ConcursoService;
import concursos.interfaces.DisciplinaService;
import concursos.modelos.Arquivo;
import concursos.modelos.Concurso;
import concursos.modelos.Disciplina;
import concursos.modelos.Usuario;

@ManagedBean
@SessionScoped
public class ConcursoMB implements Serializable {

	private static final long serialVersionUID = -3636453914971038861L;
	@EJB
	private ConcursoService beanConcurso;
	@EJB
	private ArquivoService beanArquivo;
	private Concurso concurso = new Concurso();
	private int idBusca, idExclusao;
	private List<Concurso> listaConcursos = new ArrayList<Concurso>();
	@SuppressWarnings("unused")
	private List<Arquivo> listaArquivos = new ArrayList<Arquivo>();
	private Concurso concursoSelecionado;
	private String filtroBusca = "";
	@EJB
	private DisciplinaService beanDisciplina;
	private Disciplina disciplina = new Disciplina();
	private List<Disciplina> listaDisciplinas = new ArrayList<Disciplina>();
	private int id_usuario;
	private Usuario usuario;

	public ConcursoMB() {
		/*
		 * Object user = (Usuario) FacesContext.getCurrentInstance()
		 * .getExternalContext().getSessionMap().get("usuario");
		 * 
		 * this.usuario = (Usuario) user; this.id_usuario = usuario.getId();
		 */
	}

	public void updateConcurso(Concurso concurso) throws IOException {
		setConcurso(concurso);
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("cadastrarConcurso.xhtml");
	}

	public void cadastrarDisciplina() {
		this.disciplina.setConcurso(this.concursoSelecionado);
		this.beanDisciplina.cadastrarDisciplina(this.disciplina);

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso", "Disciplina "
				+ this.disciplina.getNome() + " cadastrada com sucesso."));

		this.disciplina = new Disciplina();
		this.listaDisciplinas = this.beanDisciplina
				.buscarPorConcurso(this.concursoSelecionado.getId());
	}

	public void onEdit(RowEditEvent event) {
		this.beanDisciplina.cadastrarDisciplina((Disciplina) event.getObject());
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Disciplina alterada com sucesso."));
	}

	public void buscar() throws IOException {
		switch (this.filtroBusca) {
		case "Todos":
			this.listaConcursos = this.beanConcurso
					.listarConcursos(this.id_usuario);

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarConcursos.xhtml");
			break;
		case "Novos":
			this.listaConcursos = new ArrayList<Concurso>();
			this.listaConcursos = this.beanConcurso
					.listarConcursosNovos(this.id_usuario);

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarConcursos.xhtml");
			break;
		case "Antigos":
			this.listaConcursos = new ArrayList<Concurso>();

			this.listaConcursos = this.beanConcurso
					.listarConcursosAntigos(this.id_usuario);

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarConcursos.xhtml");
			break;
		case "":
			this.listaConcursos = new ArrayList<Concurso>();

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarConcursos.xhtml");
			break;
		default:
			break;
		}
	}

	public void urlAtualizarConcurso() throws IOException {
		setConcurso(this.concursoSelecionado);
		
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("cadastrarConcurso.xhtml");
	}
	
	public void urlCadConcurso() throws IOException {
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("cadastrarConcurso.xhtml");
	}

	public void cadastrarConcurso() throws Exception {
		boolean erro = false;
		int contador = 0;

		FacesContext context = FacesContext.getCurrentInstance();
		context.getExternalContext().getFlash().setKeepMessages(true);

		this.concurso.setUsuario(this.usuario);

		try {
			String msgErro = this.beanConcurso.cadastrarConcurso(concurso);

			if (!msgErro.equals("")) {
				context.addMessage(null, new FacesMessage(
						FacesMessage.SEVERITY_WARN, "Erro", msgErro));

				this.urlCadConcurso();

				erro = true;
			}
		} catch (Exception exception) {
			erro = true;
		}

		if (!erro) {
			for (Concurso c : this.beanConcurso
					.listarConcursosNovos(this.id_usuario))
				if (c.getDataProva().compareTo(concurso.getDataProva()) == 0) {
					contador++;

				}

			if (contador > 1)
				context.addMessage(null, new FacesMessage(
						FacesMessage.SEVERITY_WARN, "Aviso",
						"Voce ja possui outra prova neste mesmo dia."));

			this.concursoSelecionado = new Concurso();
			setConcursoSelecionado(this.concurso);

			context.getExternalContext().getFlash().setKeepMessages(true);
			context.addMessage(null, new FacesMessage("Sucesso",
					"Concurso cadastrado com sucesso"));

			if (this.filtroBusca.equals("Todos"))
				this.listaConcursos = this.beanConcurso
						.listarConcursos(this.id_usuario);
			else if (this.filtroBusca.equals("Novos"))
				this.listaConcursos = this.beanConcurso
						.listarConcursosNovos(this.id_usuario);
			else if (this.filtroBusca.equals("Antigos"))
				this.listaConcursos = this.beanConcurso
						.listarConcursosAntigos(this.id_usuario);

			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("detalhesConcurso.xhtml");
			this.concurso = new Concurso();
		} else
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Aviso",
							"Ja possui um concurso com este nome, identifique-o de outra forma."));

	}

	public void excluirConcurso() {
		try {
			this.beanConcurso.excluirConcurso(this.concursoSelecionado);
		} catch (Exception exception) {
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage(null, new FacesMessage("Erro",
					"Este concurso possue arquivos ou lembretes relacionados."));
		}

		try {
			this.buscar();
		} catch (IOException exception) {
		}
	}

	public List<Concurso> listarConcursos() {
		this.listaConcursos = this.beanConcurso
				.listarConcursos(this.id_usuario);
		return this.listaConcursos;
	}

	public void buscaPorId() {
		this.concurso = this.beanConcurso.buscaPorId(idBusca);
	}

	public int getIdBusca() {
		return this.idBusca;
	}

	public void setIdBusca(int idBusca) {
		this.idBusca = idBusca;
	}

	public int getIdExclusao() {
		return this.idExclusao;
	}

	public void setIdExclusao(int idExclusao) {
		this.idExclusao = idExclusao;
	}

	public ConcursoService getBeanConcurso() {
		return this.beanConcurso;
	}

	public void setBeanConcurso(ConcursoService beanConcurso) {
		this.beanConcurso = beanConcurso;
	}

	public Concurso getConcurso() {
		return this.concurso;
	}

	public void setConcurso(Concurso concurso) {
		this.concurso = concurso;
	}

	public void setListaConcursos(List<Concurso> listaConcursos) {
		this.listaConcursos = listaConcursos;
	}

	public void anexarArquivo(Concurso concurso) throws IOException {
		this.concursoSelecionado = new Concurso();
		this.concursoSelecionado = concurso;
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("adicionarArquivo.xhtml");
	}

	public List<Arquivo> getListaArquivos() {
		return this.beanArquivo
				.listarArquivosPorConcurso(this.concursoSelecionado.getId());
	}

	public List<Disciplina> getListaDisciplinas() {
		if (this.listaDisciplinas.isEmpty())
			this.listaDisciplinas = this.beanDisciplina
					.buscarPorConcurso(this.concursoSelecionado.getId());

		return this.listaDisciplinas;
	}

	public void exibirDetalhesConcurso(Concurso concurso) throws IOException {
		setConcursoSelecionado(concurso);
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("detalhesConcurso.xhtml");
	}

	public Concurso getConcursoSelecionado() {
		return this.concursoSelecionado;
	}

	public void setConcursoSelecionado(Concurso concursoSelecionado) {
		this.concursoSelecionado = concursoSelecionado;
	}

	public String getFiltroBusca() {
		return this.filtroBusca;
	}

	public void setFiltroBusca(String filtroBusca) {
		System.out.println("recebido: " + filtroBusca);
		this.filtroBusca = filtroBusca;
	}

	public Disciplina getDisciplina() {
		return this.disciplina;
	}

	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}

	public List<Concurso> getListaConcursos() {
		return this.listaConcursos;
	}

	public void setListaDisciplinas(List<Disciplina> listaDisciplinas) {
		this.listaDisciplinas = listaDisciplinas;
	}

	public void selecionarConcurso(Concurso concurso) {
		this.concursoSelecionado = new Concurso();
		setConcursoSelecionado(concurso);
	}

	public void urlDetalhesConcurso() throws IOException {
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("detalhesConcurso.xhtml");
	}

	public void setListaArquivos(List<Arquivo> listaArquivos) {
		this.listaArquivos = listaArquivos;
	}

	public int getId_usuario() {
		return this.id_usuario;
	}

	public void setId_usuario(int id_usuario) {
		this.id_usuario = id_usuario;
	}

	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

}